<?php
/**
 * index.php     Zhuayi 主框架文件
 *
 * @copyright    (C) 2005 - 2010  Zhuayi
 * @licenes      http://www.zhuayi.net
 * @lastmodify   2010-10-27
 * @author       zhuayi
 * @QQ			 2179942
 */

class zhuayi
{
	/**
	 * 构造函数
	 */
	function __construct()
	{
		
		/* 加载网站配置文件 */
		$webconfig = $this->load_config('web');
		foreach ($webconfig as $key=>$val)
		{
			$this->$key = $val;
		}
		
		
		$this->routing = $this->routing();
		
		/* 当前url地址 */
		$this->url = $webconfig['weburl'].$webconfig['dir'].$this->routing['routing']['m'].'/';
		
		/* 当前路径 */
		$this->path = $webconfig['weburl'].$webconfig['dir'].'zhuayi/'.$this->routing['routing']['m'].'/template/';
		
		
	}

	/* 
	 * URL路由，只允许出现mvc模式
	 * @return 返回数组 键值M=模型，c=方法
	 */
	function routing()
	{
		
		$url = $_SERVER["REQUEST_URI"];
		
		/* 取出"?"后的参数 */
		$url = preg_replace('#\?(.*)|&(.*)#','',$url);
		
		/* 根据"/"把URL转换成数组 */
		$url = explode('/',$url);
		
		
		if ('/'.$url['1'].'/' == $this->dir)
		{
			unset($url[1]);
		}
		$url = explode('/',implode('/',$url));
		
		
		/* 删除第一个键值 */
		unset($url[0]);
		
		/*设置前两个为模型和方法 */
		$m = (empty($url['1']) || $url['1']=='index.php')?'index':$url[1];
		$c = empty($url['2'])?'index':$url[2];
		
		/*删除前两个键值，剩下的为方法的参数 */
		unset($url[1]);
		unset($url[2]);
		
		$routing = array('routing'=>array('m'=>$m,'c'=>$c),'fileds'=>$url);
		return $routing;
	}

	/** 
	 * 映射模型 
	 */
	function app()
	{
		/* 载入模型 */
		$this->load_modle($this->routing['routing']['m'],$this->routing['routing']['c'],$this->routing['fileds']);

	}
	
	/**
	 * 载入模块方法
	 *
	 * @param string $modle 模块名称
	 * @param string $fun 模块方法
	 * @param final  $array 该模块对应的参数
	 *
	*/
	
	function load_modle($modle,$fun,$array=array())
	{
		
		$class = $modle.'_action';
		
		if (class_exists($class))
		{
			$app = new $class;
				
			/* 载入该模块的配置文件，如果存在的话 */
			$fileds = $this->load_config($class);
			
			/* 以配置文件初始该模块 */
			foreach ($fileds as $key=>$val)
			{
				$app->$key = $val;
			}
		}
		else
		{
			message::_404('没有找到此模块...');
		}
		
		/* 检查方法 */
		if (method_exists($app,$fun))
		{
			call_user_func_array(array($app,$fun),$array);
			
		}
		else
		{
			message::_404('没有找到此方法...');
		}
	}

	
	/** 
	 * 动态加载类，一般适用在直接new，如new cookie，或者cookie::set_cookie
	 * 
	 * @param string $class_name 类文件
	 */
	static function _load_class($class_name)
	{
		
		/* 判断是否有"_",有则表示是模块类 */
		$class_name = explode('_',$class_name);
		
		if (!empty($class_name[1]))
		{
			$filename = ZHUAYI_ROOT.'/zhuayi/'.$class_name[0]."/".$class_name[0]."_".$class_name[1].".php";
		}
		else
		{
			$filename = ZHUAYI_ROOT.'/class/'.$class_name[0].".class.php";
		}
		
		self::_includes($filename,'加载《'.$class_name[0].'》失败...');
		
	}
	
	/**
	 * 加载类带实例化，和初始配置
	 * @param string $class 类名
	 * @param bool $construct 是否构造函数有参数
	 */
	function load_class($class,$construct = false)
	{
		/*加载类文件 */
		self::_load_class($class);
		
		/* 载入类的配置文件*/
		$fileds = $this->load_config($class);
		
		if ($construct === false)
		{
			$app = new $class($fileds);
		}
		else
		{
			$app = new $class ;
			
			/* 以配置文件初始该模块 */
			foreach ($fileds as $key=>$val)
			{
				$app->$key = $val;
			}
		}

		return $app;
	}
	
	/**
	 * 加载文件，失败返回错误
	 *
	 * @param string $filename 文件路径
	 * @param string $error 错误信息
	 */
	static function _includes($filename,$error='系统错误！')
	{
		if (file_exists($filename))
		{
			return require $filename;
		}
		else
		{
			message::_404($error);
		}
	}
	
	/**
	 * 载入模版 
	 * 
	 * 模型和方法以“_”连接,如$this->load_tpl('index_index') 载入的就是index/template/index_index.html模版
	 *
	 * @param string $filename 模版名称
	 *
	*/
	function load_tpl($filename)
	{
		$filename = explode('_',$filename);
		
		return ZHUAYI_ROOT.'/zhuayi/'.$filename[0].'/template/'.$filename[0].'_'.$filename[1].'.'.'html';
	}
	
	
	
	/**
	 * 载入配置文件
	 *
	 * @param string $config 配置文件名
	 */
	function load_config($config)
	{
		
		/* 以"_"为种子转换数组, 判断是模型还是系统*/
		$config = explode('_',$config);
		
		if (!empty($config[1]))
		{
			$file = ZHUAYI_ROOT.'/zhuayi/'.$config[0].'/config.php';
		}
		else
		{
			/* 默认配置文件 */
			$file = ZHUAYI_ROOT.'/config/'.$config[0].'.config.php';
		}
		
		/* 检查是否存在,不存在则不载入 */
		if (file_exists($file))
		{
			return require $file;
		}
		else
		{
			return array();
		}
		
	}
	
	/**
	 * 函数调用
	 * @param string $fun_name 函数名 
	 */
	function load_fun($fun_name)
	{
		/* 获取全部参数 */
		$fun = func_get_args();	
		$fun_name = $fun[0];
		unset($fun[0]);
		
		/* 载入函数文件 */
		include_once ZHUAYI_ROOT.'/function/'.$fun_name.'.php';
		
		if (function_exists($fun_name))
		{
			return call_user_func_array($fun_name,$fun);
		}
		else
		{
			message::_404('调用函数'.$fun_name.'失败...');
			
		}
	}
	
	/**
	 * 数据工厂
	 *
	 */
	function db()
	{
		
		/* 载入数据库操作类 */
		return $this->load_class('db');
	}
	
	/* 邮件 */
	function email($email,$title,$body)
	{
		/* 检查body 是否数组，如果是数组，则表示是要载入模版 */
		if (is_array($body))
		{
			$file = array_keys($body);
			$file = $file[0];
			
			$data = array_values($body);
			$data = $data[0];
			/* 检查文件是否存在 */
			if (!file_exists($file))
			{
				return '模版错误..';
			}
			$body = file_get_contents($file);
			
			foreach ($data as $key=>$val)
			{
				$body  = str_replace('{'.$key.'}',$val,$body);
			}	
		}
		
		$mail = $this->load_class('phpmailer',true);
		$mail->SetLanguage('zn');
		$mail->IsSMTP();
		$mail->SMTPDebug  = 0;
		$mail->SMTPAuth   = true;
		$mail->SetFrom($mail->Username,$mail->mail_from);
		$mail->Subject = $title;
		$mail->MsgHTML(stripcslashes($body));
		$mail->AddAddress($email);
		if(!$mail->Send())
		{
		  return $mail->ErrorInfo;
		}
		else
		{
		  return "ok";
		}
	}
	
	/**
	 * 打印测试 
	 *
	 *@param final $array 可以是数组也可以是字符串
	 */
	function test($array)
	{
		
		echo '<pre>';
		echo '<br>===================================================================<br>';
		print_r($array);
		echo '<br>===================================================================<br>';
		
	}

}
?>